var fs = require("fs");
var path = require("path");

let defaultName = "rnapp"; // RN_0.57.8
let projectName = defaultName;
let templateName = defaultName;
var rootFilePath = path.resolve(defaultName);
let dir_mark = 0;
let mark = 0;
exports.replaceAll = async (oldtemplateName = defaultName, newprojectName) => {
  projectName = newprojectName;
  templateName = oldtemplateName;
  rootFilePath = path.resolve(projectName);
  console.log("projectName:", projectName);
  console.log("rootFilePath:", rootFilePath);

  try {
    let err = fs.renameSync(templateName, projectName);
  } catch (e) {}

  if (!fs.existsSync(projectName)) {
    console.log(
      _logSymbols2.default.error,
      _chalk2.default.red("项目目录不能为空！")
    );
    return true;
  }
  dir_mark = 0;
  mark = 0;
  return new Promise((resolve, reject) => {
    //调用文件遍历方法
    let res1 = fileDisplay(rootFilePath);

    if (res1 && res1 != "ok") {
      reject(err);
      return true;
    }
    let res2 = updateFileContent(rootFilePath);
    if (res2 && res2 != "ok") {
      reject(err);
      return true;
    }
    resolve(res2);
  });
};

exports.dirmarkfun = () => {
  return dir_mark;
};

exports.markfun = () => {
  return mark;
};

/**

    文件遍历方法
    @param filePath 需要遍历的文件路径
   **/
function fileDisplay(filePath, errBack) {
  // console.log(filePath);

  //根据文件路径读取文件，返回文件列表
  let files = fs.readdirSync(filePath);

  if (files) {
    //遍历读取到的文件列表
    for (const filename of files) {
      //获取当前文件的绝对路径
      var filedir = path.join(filePath, filename);
      if (filedir.indexOf("node_modules") > 1 || filedir.indexOf("Pods") > 1) {
        continue;
      }
      //根据文件路径获取文件信息，返回一个fs.Stats对象
      let stats = fs.statSync(filedir);
      if (!stats) {
        continue;
      }
      var isDir = stats.isDirectory(); //是文件夹

      if (isDir) {
        if (
          filedir.indexOf("gradle") > 1 ||
          filedir.indexOf("build") > 1 ||
          filedir.indexOf("keystore") > 1 ||
          filedir.indexOf("assets") > 1 ||
          filedir.indexOf("libs") > 1 ||
          filedir.indexOf(".framework") > 1 ||
          filedir.indexOf(".idea") > 1 ||
          filedir.indexOf(".xcassets") > 1 ||
          filedir.indexOf("node_modules") > 1
        ) {
          continue;
        }
        if (filedir.indexOf(templateName) > 1) {
          var path1 = path.resolve(filedir);
          // var path2 = path.resolve(`${filePath}${projectName}`);
          var filedir2 = path1.replace(
            new RegExp(templateName, "ig"),
            projectName
          );
          // var path2 = path.resolve(filedir2);
          let err = fs.renameSync(path1, filedir2);
          if (err) {
            console.error(err);
            continue;
          }
          dir_mark += 1;

          // console.log(filedir2);
          fileDisplay(filedir2);

          continue;
        }
        fileDisplay(filedir); //递归，如果是文件夹，就继续遍历该文件夹下面的文件
      }
    }
  }
  return "ok";
}

function updateFileContent(filePath) {
  //根据文件路径读取文件，返回文件列表
  let files = fs.readdirSync(filePath);

  if (files) {
    //遍历读取到的文件列表
    for (const filename of files) {
      //获取当前文件的绝对路径
      var filedir = path.join(filePath, filename);
      if (
        filedir.indexOf("node_modules") > 1 ||
        filedir.indexOf("Pods") != -1
      ) {
        continue;
      }
      //根据文件路径获取文件信息，返回一个fs.Stats对象
      let stats = fs.statSync(filedir);
      if (!stats) {
        continue;
      }

      var isFile = stats.isFile(); //是文件
      var isDir = stats.isDirectory(); //是文件夹
      if (isDir) {
        if (
          filedir.indexOf("gradle") > 1 ||
          filedir.indexOf("build") > 1 ||
          filedir.indexOf("keystore") > 1 ||
          filedir.indexOf("assets") > 1 ||
          filedir.indexOf("libs") > 1 ||
          filedir.indexOf(".framework") > 1 ||
          filedir.indexOf(".idea") > 1 ||
          filedir.indexOf(".xcassets") > 1 ||
          filedir.indexOf("node_modules") > 1
        ) {
          continue;
        }
        updateFileContent(filedir);
        continue;
      }
      if (isFile) {
        // console.log(filedir);
        if (
          filedir.indexOf(".jpg") > 1 ||
          filedir.indexOf(".png") > 1 ||
          filedir.indexOf(".iml") > 1 ||
          filedir.indexOf("keystore") > 1 ||
          filedir.indexOf(".entitlements") > 1 ||
          filedir.indexOf(".xcassets") > 1 ||
          filedir.indexOf(".ttf") > 1 ||
          filedir.indexOf(".jar") > 1
        ) {
          // console.log("不处理：", filedir);
          continue;
        }
        if (filedir.indexOf(templateName) > 1) {
          var path1 = path.resolve(filedir);
          // var path2 = path.resolve(`${filePath}${projectName}`);
          var filedir2 = filedir.replace(
            new RegExp(templateName, "ig"),
            projectName
          );
          // var path2 = path.resolve(filedir2);
          let err = fs.renameSync(path1, filedir2);
          if (err) {
            console.error(err);
            continue;
          }
          dir_mark += 1;
          // console.log("处理文件名:", filedir2);
          replaceContent(filedir2);
          continue;
        }
        replaceContent(filedir);
      }
    }
  }
  return "ok";
}

function replaceContent(filedir) {
  mark += 1;
  if (
    !projectName ||
    projectName === undefined ||
    projectName === "undefined"
  ) {
    console.log(filedir);
  }
  let files = fs.readFileSync(filedir, "utf8");
  try {
    var result = files.replace(new RegExp(templateName, "ig"), projectName);
    if (result && result.length > 0) {
      fs.writeFile(filedir, result, "utf8", function(err) {
        if (err) {
          console.log("save fail:", filedir);
        }
      });
    }
  } catch (e) {
    console.log("fail:", filedir);
  }
}
